package com.pokermind.dse.tcp.client.preset;

import java.util.*;

/**
 * 场景注册表 - 管理所有测试场景
 * V4.2: 支持 Straddle、新增字段等
 * 
 * @author PokerMind Team
 */
public class ScenarioRegistry {
    
    private static final Map<String, ScenarioFactory> SCENARIOS = new LinkedHashMap<>();
    
    static {
        // ========== 完整版：2~9人全覆盖 ==========
        
        // 人数覆盖场景（2~9人）
        SCENARIOS.put("players_2", PresetScenario::createClassicBTNvsBB);        // 2人对决
        SCENARIOS.put("players_3", PresetScenario::createMultiway3Players);      // 3人底池
        SCENARIOS.put("players_4", PresetScenario::createMultiway4Players);      // 4人底池
        SCENARIOS.put("players_5", PresetScenario::create5MaxScenario);          // 5人桌
        SCENARIOS.put("players_6", PresetScenario::create6MaxScenario);          // 6人桌
        SCENARIOS.put("players_7", PresetScenario::create7MaxScenario);          // 7人桌
        SCENARIOS.put("players_8", PresetScenario::create8MaxScenario);          // 8人桌
        SCENARIOS.put("players_9", PresetScenario::createFullRing9Players);      // 9人满桌
        
        // 街道覆盖场景
        SCENARIOS.put("3bet", PresetScenario::createPreflopThreeBet);        // 翻前3-bet
        SCENARIOS.put("full_hand", PresetScenario::createAllInScenario);     // 完整手牌
        
        // 风格场景
        SCENARIOS.put("aggressive", PresetScenario::createAggressiveRaising);    // 激进加注
        SCENARIOS.put("conservative", PresetScenario::createConservativePlay);   // 保守跟注
        
        // 特殊功能场景（V4.6+）
        SCENARIOS.put("run_it_twice", PresetScenario::createRunItTwice);         // Run It Twice 场景（2人）
        SCENARIOS.put("run_it_twice_6p", PresetScenario::createRunItTwice6Players);  // Run It Twice 场景（6人）
        
        // 快捷别名
        SCENARIOS.put("basic", PresetScenario::createClassicBTNvsBB);            // 2人基础
        SCENARIOS.put("multiway", PresetScenario::createMultiway4Players);       // 多人
        SCENARIOS.put("fullring_9", PresetScenario::createFullRing9Players);     // 满桌
        SCENARIOS.put("holdem_basic", PresetScenario::createClassicBTNvsBB);     // 德州扑克
    }
    
    @FunctionalInterface
    interface ScenarioFactory {
        PresetScenario create();
    }
    
    /**
     * 获取场景
     */
    public static PresetScenario getScenario(String scenarioName) {
        ScenarioFactory factory = SCENARIOS.get(scenarioName);
        if (factory == null) {
            throw new IllegalArgumentException("未知场景: " + scenarioName + 
                "\n可用场景: " + String.join(", ", SCENARIOS.keySet()));
        }
        return factory.create();
    }
    
    /**
     * 获取所有场景名称
     */
    public static Set<String> getAllScenarioNames() {
        return SCENARIOS.keySet();
    }
    
    /**
     * 列出所有场景 (V4.7优化版)
     */
    public static void listAllScenarios() {
        System.out.println("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
        System.out.println("  核心测试场景 (V4.7优化版)");
        System.out.println("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
        System.out.println();
        
        System.out.println("【人数覆盖】8个场景 (2~9人全覆盖) ⭐⭐⭐");
        System.out.println("  players_2       - 2人对决");
        System.out.println("  players_3       - 3人底池");
        System.out.println("  players_4       - 4人底池");
        System.out.println("  players_5       - 5人桌");
        System.out.println("  players_6       - 6人桌");
        System.out.println("  players_7       - 7人桌");
        System.out.println("  players_8       - 8人桌");
        System.out.println("  players_9       - 9人满桌");
        System.out.println();
        
        System.out.println("【街道覆盖】2个场景");
        System.out.println("  3bet            - 翻前3-bet场景");
        System.out.println("  full_hand       - 完整手牌到河牌");
        System.out.println();
        
        System.out.println("【风格场景】2个场景");
        System.out.println("  aggressive      - 激进加注场景");
        System.out.println("  conservative    - 保守跟注场景");
        System.out.println();
        
        System.out.println("【特殊功能】V4.6+ ⭐");
        System.out.println("  run_it_twice    - Run It Twice（2人对决）");
        System.out.println("  run_it_twice_6p - Run It Twice（6人牌局）");
        System.out.println();
        
        System.out.println("【快捷别名】向后兼容");
        System.out.println("  basic           - = players_2 (2人基础)");
        System.out.println("  multiway        - = players_4 (多人)");
        System.out.println("  fullring_9      - = players_9 (满桌)");
        System.out.println("  holdem_basic    - = players_2 (德州扑克)");
        System.out.println();
        
        System.out.println("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
        System.out.println("总计：18个场景 (人数8 + 街道2 + 风格2 + 特殊2 + 别名4 = 16个唯一场景)");
        System.out.println("覆盖率：100% 人数全覆盖(2-9) + 完整功能覆盖 + 特殊功能 + RIT多人场景");
        System.out.println("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
    }
    
    /**
     * 验证场景
     */
    public static boolean isValidScenario(String scenarioName) {
        return SCENARIOS.containsKey(scenarioName);
    }
}

